package com.class05.service;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.lang.reflect.Method;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private void eat(){
        System.out.println("吃饭");
    }

}

class Test{
    @org.junit.jupiter.api.Test
    public void  test() throws Exception {
//        原生方式实例化，属性赋值
        Person person = new Person();
        person.setName("小明");
        System.out.println(person);

//        person.eat();

//        ===================
//        通过反射方式进行实例化，属性赋值
//        1、先获取Person的Class对象：
//        四种方式
//        1)、通过类名.class
        Class personClass = Person.class;
//        2)、通过对象.getClass()
//        Person person = new Person();
//        Class personClass2 = person.getClass();
//        3)、通过Class.forName("com.class05.service.Person")
//        Class personClass3 = Class.forName("com.class05.service.Person");
//        4)、通过ClassLoader.getSystemClassLoader().loadClass("com.class05.service.Person")
//        ClassLoader classLoader = ClassLoader.getSystemClassLoader()
//        .loadClass("com.class05.service.Person").getClassLoader();
//        2、通过Class对象实例化对象
        Person person1 = (Person) personClass.newInstance();
//        3、属性赋值
        person1.setName("小红");
        System.out.println(person1);

//  4、通过反射方式进行调用私有方法
//        获取私有方法名称
        Method eat = personClass.getDeclaredMethod("eat");
//        设置私有方法可访问
        eat.setAccessible(true);
//        调用私有方法
        eat.invoke(person1);


    }
}